﻿using Sinacor.Infra.Service.Validation.BusinessRules;
using Sinacor.Infra.Service.Security.Authorization;
using System.Collections.Generic;
using System;

namespace Sinacor.Servico.Bovespa.ManutencaoOrdens.BusinessLogic.BusinessRulesValidation
{
    public class ValidadorCancelamentoOrdem : BaseBusinessRuleValidation<BusinessEntity.Ordem>, IBusinessRuleValidation
    {

        #region Campos

        private BusinessEntity.Justificativa _justificativa;
        private Movimento.BusinessEntity.InformacoesMovimento _informacoesMovimento;

        private int ORDEM_ABERTA_VIA_MENSAGERIA = 109402;
        private int EXECUCAO_RETROATIVA = 109291;
        private int JUSTIFICATIVA_NULA = 109401;
        private int NUMERO_ORDEM_ORIGINAL = 109287;
        private int SITUCAO_EXERCICIO = 109289;
        private int PERMISSAO_ORDEM_RETROATIVA = 109288;

        #endregion

        #region Construtor
        public ValidadorCancelamentoOrdem(BusinessEntity.Justificativa justificativa, Movimento.BusinessEntity.InformacoesMovimento informacoesMovimento)
        {
            this._justificativa = justificativa;
            this._informacoesMovimento = informacoesMovimento;
        }
        #endregion


        #region Metodos

        /// <summary>
        /// Obter lista de erros
        /// </summary>
        public List<Infra.Common.Validation.ValidationError> GetErrors()
        {
            return base.ErrorsList;
        }

        /// <summary>
        /// Validar Detalhe Ordem
        /// </summary>
        private void ValidarDetalheOrdem()
        {
            ResourceAccess.ManutencaoOrdens raManutencao = new ResourceAccess.ManutencaoOrdens();

            if (raManutencao.VerificarOrdemAbertaViaMensageria(base.EntityToValidate))
                base.AddValidationError(ORDEM_ABERTA_VIA_MENSAGERIA);

            if (base.EntityToValidate.QuantidadeExecutada > 0)
            {
                if (raManutencao.VerificarExecucaoRetroativa(base.EntityToValidate))
                    base.AddValidationError(EXECUCAO_RETROATIVA);
            }

        }

        /// <summary>
        /// Validar Justificativa
        /// </summary>
        private void ValidarJustificativa()
        {
            if (_justificativa == null || (String.IsNullOrEmpty(_justificativa.JustificativaOrdem)&& !_justificativa.PendenteMensageria))
                base.AddValidationError(JUSTIFICATIVA_NULA);
        }

        /// <summary>
        /// Validar Ordem
        /// </summary>
        private void ValidarOrdem()
        {
            ResourceAccess.ManutencaoOrdens raManutencao = new ResourceAccess.ManutencaoOrdens();
            
            this.ValidarJustificativa();

            if (base.EntityToValidate.NumeroOrdemOriginal != null && base.EntityToValidate.NumeroOrdemOriginal != 0)
            {
                List<Object> param = new List<object>();
                param.Add(base.EntityToValidate.NumeroOrdemOriginal);

                base.AddValidationError(NUMERO_ORDEM_ORIGINAL, string.Empty, param);
            }

            if (base.EntityToValidate.DataValidade < _informacoesMovimento.DataMovimento)
                this.ValidarPermissaoOrdemRetroativa();
            else
            {
                if (base.EntityToValidate.Situacao == BusinessEntity.Enum.SituacaoOrdem.Exercicio)
                    base.AddValidationError(SITUCAO_EXERCICIO);
            }

            if (raManutencao.VerificarOrdemAbertaViaMensageria(base.EntityToValidate))
                base.AddValidationError(ORDEM_ABERTA_VIA_MENSAGERIA);

            if (base.EntityToValidate.QuantidadeExecutada > 0)
            {
                if (raManutencao.VerificarExecucaoRetroativa(base.EntityToValidate))
                    base.AddValidationError(EXECUCAO_RETROATIVA);
            }
        }

        /// <summary>
        /// Validar Permissao Ordem Retroativa
        /// </summary>
        private void ValidarPermissaoOrdemRetroativa()
        {
            if (!AuthorizationContext.Current.CheckUserAccess("D1SIM", "ORD"))
                base.AddValidationError(PERMISSAO_ORDEM_RETROATIVA);
        }

        /// <summary>
        /// Validar entidade
        /// </summary>
        public void Validate()
        {
            this.ValidarOrdem();

            if (base.EntityToValidate.Detalhes != null)
            {
                if (base.EntityToValidate.Detalhes.Count > 0)
                {
                    this.ValidarDetalheOrdem();
                }
            }
        }

        #endregion

    }//end ValidadorCancelamentoOrdem

}//end namespace BusinessRulesValidation